#include "ThreadTask.h"
#include "Future.h"

void test1s(void* this, void* arg) {
    static int cnt = 0;
    Future_t *pFuture = arg;
    LOG_DEBUG("1s test");
    FutureSetValue(pFuture, cnt++);
    sleep(1);
    ThreadTaskAdd(this, (ThreadTaskFunc_t)&test1s, arg, 0);
}

void test5s(void* this, void* arg) {
    LOG_DEBUG("5s test");
    sleep(5);
    ThreadTaskAdd(this, (ThreadTaskFunc_t)&test5s, NULL, 0);
}

int main() {
    // 线程数不宜设置过大，避免操作系统频繁进行上下文切换造成性能浪费。
    // 建议设置为设备核心数，对于io操作较多的任务，可以适当增加线程数至设备核心数的1～3倍。
    ThreadTask_t* threadTask = ThreadTaskCreate((int32_t)sysconf(_SC_NPROCESSORS_ONLN), 256, 1);
    if (!threadTask) {
        LOG_ERROR("err\r\n");
        return 0;
    }

    Future_t future;
    FutureInit(&future);
    ThreadTaskAdd(threadTask, (ThreadTaskFunc_t)&test1s, &future, 0);
    ThreadTaskAdd(threadTask, (ThreadTaskFunc_t)&test5s, NULL, 0);

    while (1) {
        static int lastValue = 0;
        int value = FutureGetValue(&future);
        if (lastValue != value) {
            lastValue = value;
            LOG_DEBUG("value: %d", value);
        }

        // do something to break this loop...
    }

    FutureDestroy(&future);
    ThreadTaskDestory(threadTask, 1);
    return 0;
}
